#include "stm32f10x.h"                  // Device header
//因为有正反转，所以用一个带符号的
int16_t Count;
void Encoder_Init(void){
	//初始化PB0和PB1两个GPIO口的外部中断
	//对于编码器而言，可以只设一个，因为A触点与B触电固然会出现两者一个在高电位一个在低电位的情况
	//我们使用当A与B同时中断，当A低电平B下降沿时，为正转
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//注意APB2与APB1的总线
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

	
	
	GPIO_InitTypeDef GPIO_InitStructure;
	
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉，默认高电平
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);
	
	
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);

	EXTI_InitTypeDef EXTI_InitStructure;
	EXTI_InitStructure.EXTI_Line=EXTI_Line0|EXTI_Line1; //配置EXTI的第14个线路为中断模式
	EXTI_InitStructure.EXTI_LineCmd=ENABLE;  //开启中断，使PB14的电平信号通过EXTI通向下一级NVIC
	EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
	//EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising_Falling;  //双边沿触发
	EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;
	EXTI_Init(&EXTI_InitStructure);
	//5 配置NVIC，由于NVIC为内核外设，所以放到misc.h
	//两个通道0和1
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn; //配置通道
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //开启触发
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;  //配置抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;  //配置响应优先级
	NVIC_Init(&NVIC_InitStructure);
	
	NVIC_InitStructure.NVIC_IRQChannel=EXTI1_IRQn; //配置通道
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //开启触发
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;  //配置抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;  //配置响应优先级
	NVIC_Init(&NVIC_InitStructure);
}

void EXTI0_IRQHandler(void){
	if(EXTI_GetFlagStatus(EXTI_Line0)==SET){
		if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0){//判断另一个引脚的电平
			Count--;
		}
		EXTI_ClearITPendingBit(EXTI_Line0);
	}
}
	
void EXTI1_IRQHandler(void){
	if(EXTI_GetFlagStatus(EXTI_Line1)==SET){
		if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==0){//判断另一个引脚的电平
			Count++;
		}
		EXTI_ClearITPendingBit(EXTI_Line1);
	}
}
int16_t Get_Count(void){
	//每次调用函数之后，返回Count的变化值，用于外部加减的变量，所以需要返回Count，把Count清0？？？？
	int16_t tmp;
	tmp=Count;
	Count=0;
	return tmp;
}